// Uses Clause (Uses子句) 示例
// 演示 Pascal 中Uses子句的各种用法
program p_37_uses_clause;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 在程序中使用多个单元
uses
  SysUtils,     // 系统工具单元，包含常用的系统函数
  Classes,      // 类单元，包含TStringList等类
  Math,         // 数学单元，包含数学函数
  DateUtils;    // 日期时间单元，包含日期时间处理函数

// 自定义类型
type
  TPerson = record
    Name: String;
    BirthDate: TDateTime;
  end;

// 自定义函数
function CalculateAge(BirthDate: TDateTime): Integer;
begin
  Result := YearsBetween(Now, BirthDate);
end;

// 程序主入口
begin
  WriteLn('=== Pascal Uses子句示例 ===');
  WriteLn;
  
  // 1. 使用SysUtils单元的功能
  WriteLn('1. 使用SysUtils单元的功能:');
  var currentDate: TDateTime := Now;
  WriteLn('  当前日期时间: ', DateTimeToStr(currentDate));
  WriteLn('  格式化整数: ', Format('%.6d', [42]));
  WriteLn('  格式化浮点数: ', Format('%.2f', [3.14159]));
  
  WriteLn;
  
  // 2. 使用Classes单元的功能
  WriteLn('2. 使用Classes单元的功能:');
  var stringList: TStringList := TStringList.Create;
  try
    stringList.Add('第一行');
    stringList.Add('第二行');
    stringList.Add('第三行');
    stringList.Add('第四行');
    
    WriteLn('  TStringList内容:');
    for var i := 0 to stringList.Count - 1 do
      WriteLn('    ', i + 1, '. ', stringList[i]);
    
    WriteLn('  行数: ', stringList.Count);
  finally
    stringList.Free;
  end;
  
  WriteLn;
  
  // 3. 使用Math单元的功能
  WriteLn('3. 使用Math单元的功能:');
  var angle: Double := 45.0;
  var radian: Double := DegToRad(angle);
  WriteLn('  角度转弧度: ', angle:0:1, '° = ', radian:0:6, ' rad');
  WriteLn('  正弦值: sin(', angle:0:1, '°) = ', Sin(radian):0:6);
  WriteLn('  余弦值: cos(', angle:0:1, '°) = ', Cos(radian):0:6);
  WriteLn('  平方根: √16 = ', Sqrt(16):0:6);
  WriteLn('  绝对值: |-5.5| = ', Abs(-5.5):0:1);
  WriteLn('  最大值: Max(10, 20) = ', Max(10, 20));
  WriteLn('  最小值: Min(10, 20) = ', Min(10, 20));
  
  WriteLn;
  
  // 4. 使用DateUtils单元的功能
  WriteLn('4. 使用DateUtils单元的功能:');
  var birthDate: TDateTime := EncodeDate(1990, 5, 15);
  var today: TDateTime := Now;
  
  WriteLn('  出生日期: ', DateToStr(birthDate));
  WriteLn('  今天日期: ', DateToStr(today));
  WriteLn('  年龄: ', CalculateAge(birthDate), ' 岁');
  WriteLn('  相差天数: ', DaysBetween(today, birthDate), ' 天');
  WriteLn('  相差月数: ', MonthsBetween(today, birthDate), ' 个月');
  WriteLn('  相差年数: ', YearsBetween(today, birthDate), ' 年');
  
  WriteLn;
  
  // 5. 组合使用多个单元的功能
  WriteLn('5. 组合使用多个单元的功能:');
  var numbers: array[1..5] of Integer = (10, 25, 8, 33, 17);
  Write('  数组内容: ');
  for var i := 1 to 5 do
    Write(numbers[i], ' ');
  WriteLn;
  
  // 使用Math单元的Max函数和SysUtils单元的格式化功能
  var maxValue: Integer := numbers[1];
  for var i := 2 to 5 do
    if numbers[i] > maxValue then
      maxValue := numbers[i];
  
  WriteLn('  最大值: ', maxValue);
  WriteLn('  格式化输出: ', Format('最大值是 %d', [maxValue]));
  
  WriteLn;
  
  // 6. 字符串处理示例
  WriteLn('6. 字符串处理示例:');
  var text: String := '  Hello, Pascal Programming!  ';
  WriteLn('  原始文本: "', text, '"');
  WriteLn('  去除空格: "', Trim(text), '"');
  WriteLn('  转大写: "', UpperCase(text), '"');
  WriteLn('  转小写: "', LowerCase(text), '"');
  WriteLn('  文本长度: ', Length(Trim(text)));
  
  WriteLn;
  WriteLn('演示了 Pascal 中Uses子句的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.